home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / nss / base.h < prev    next >
C/C++ Source or Header  |  2006-04-20  |  32KB  |  1,449 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is the Netscape security libraries.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Netscape Communications Corporation.
  18.  * Portions created by the Initial Developer are Copyright (C) 1994-2000
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. #ifndef BASE_H
  38. #define BASE_H
  39.  
  40. #ifdef DEBUG
  41. static const char BASE_CVS_ID[] = "@(#) $RCSfile: base.h,v $ $Revision: 1.17 $ $Date: 2005/01/20 02:25:45 $";
  42. #endif /* DEBUG */
  43.  
  44. /*
  45.  * base.h
  46.  *
  47.  * This header file contains basic prototypes and preprocessor 
  48.  * definitions used throughout nss but not available publicly.
  49.  */
  50.  
  51. #ifndef BASET_H
  52. #include "baset.h"
  53. #endif /* BASET_H */
  54.  
  55. #ifndef NSSBASE_H
  56. #include "nssbase.h"
  57. #endif /* NSSBASE_H */
  58.  
  59. #include "plhash.h"
  60. #include "prthread.h"
  61.  
  62. PR_BEGIN_EXTERN_C
  63.  
  64. /*
  65.  * NSSArena
  66.  *
  67.  * The nonpublic methods relating to this type are:
  68.  *
  69.  *  nssArena_Create  -- constructor
  70.  *  nssArena_Destroy
  71.  *  nssArena_Mark
  72.  *  nssArena_Release
  73.  *  nssArena_Unmark
  74.  *
  75.  *  nss_ZAlloc
  76.  *  nss_ZFreeIf
  77.  *  nss_ZRealloc
  78.  *
  79.  * Additionally, there are some preprocessor macros:
  80.  *
  81.  *  nss_ZNEW
  82.  *  nss_ZNEWARRAY
  83.  *
  84.  * In debug builds, the following calls are available:
  85.  *
  86.  *  nssArena_verifyPointer
  87.  *  nssArena_registerDestructor
  88.  *  nssArena_deregisterDestructor
  89.  *
  90.  * The following preprocessor macro is also always available:
  91.  *
  92.  *  nssArena_VERIFYPOINTER
  93.  *
  94.  * A constant PLHashAllocOps structure is available for users
  95.  * of the NSPL PLHashTable routines.
  96.  *
  97.  *  nssArenaHashAllocOps
  98.  */
  99.  
  100. /*
  101.  * nssArena_Create
  102.  *
  103.  * This routine creates a new memory arena.  This routine may return
  104.  * NULL upon error, in which case it will have set an error on the 
  105.  * error stack.
  106.  *
  107.  * The error may be one of the following values:
  108.  *  NSS_ERROR_NO_MEMORY
  109.  *
  110.  * Return value:
  111.  *  NULL upon error
  112.  *  A pointer to an NSSArena upon success
  113.  */
  114.  
  115. /*
  116.  * XXX fgmr
  117.  * Arenas can be named upon creation; this is mostly of use when
  118.  * debugging.  Should we expose that here, allowing an optional
  119.  * "const char *name" argument?  Should the public version of this
  120.  * call (NSSArena_Create) have it too?
  121.  */
  122.  
  123. NSS_EXTERN NSSArena *
  124. nssArena_Create
  125. (
  126.   void
  127. );
  128.  
  129. extern const NSSError NSS_ERROR_NO_MEMORY;
  130.  
  131. /*
  132.  * nssArena_Destroy
  133.  *
  134.  * This routine will destroy the specified arena, freeing all memory
  135.  * allocated from it.  This routine returns a PRStatus value; if 
  136.  * successful, it will return PR_SUCCESS.  If unsuccessful, it will
  137.  * set an error on the error stack and return PR_FAILURE.
  138.  *
  139.  * The error may be one of the following values:
  140.  *  NSS_ERROR_INVALID_ARENA
  141.  *
  142.  * Return value:
  143.  *  PR_SUCCESS
  144.  *  PR_FAILURE
  145.  */
  146.  
  147. NSS_EXTERN PRStatus
  148. nssArena_Destroy
  149. (
  150.   NSSArena *arena
  151. );
  152.  
  153. extern const NSSError NSS_ERROR_INVALID_ARENA;
  154.  
  155. /*
  156.  * nssArena_Mark
  157.  *
  158.  * This routine "marks" the current state of an arena.  Space
  159.  * allocated after the arena has been marked can be freed by
  160.  * releasing the arena back to the mark with nssArena_Release,
  161.  * or committed by calling nssArena_Unmark.  When successful, 
  162.  * this routine returns a valid nssArenaMark pointer.  This 
  163.  * routine may return NULL upon error, in which case it will 
  164.  * have set an error on the error stack.
  165.  *
  166.  * The error may be one of the following values:
  167.  *  NSS_ERROR_INVALID_ARENA
  168.  *  NSS_ERROR_NO_MEMORY
  169.  *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
  170.  *
  171.  * Return value:
  172.  *  NULL upon failure
  173.  *  An nssArenaMark pointer upon success
  174.  */
  175.  
  176. NSS_EXTERN nssArenaMark *
  177. nssArena_Mark
  178. (
  179.   NSSArena *arena
  180. );
  181.  
  182. extern const NSSError NSS_ERROR_INVALID_ARENA;
  183. extern const NSSError NSS_ERROR_NO_MEMORY;
  184. extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD;
  185.  
  186. /*
  187.  * nssArena_Release
  188.  *
  189.  * This routine invalidates and releases all memory allocated from
  190.  * the specified arena after the point at which the specified mark
  191.  * was obtained.  This routine returns a PRStatus value; if successful,
  192.  * it will return PR_SUCCESS.  If unsuccessful, it will set an error
  193.  * on the error stack and return PR_FAILURE.
  194.  *
  195.  * The error may be one of the following values:
  196.  *  NSS_ERROR_INVALID_ARENA
  197.  *  NSS_ERROR_INVALID_ARENA_MARK
  198.  *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
  199.  *
  200.  * Return value:
  201.  *  PR_SUCCESS
  202.  *  PR_FAILURE
  203.  */
  204.  
  205. NSS_EXTERN PRStatus
  206. nssArena_Release
  207. (
  208.   NSSArena *arena,
  209.   nssArenaMark *arenaMark
  210. );
  211.  
  212. extern const NSSError NSS_ERROR_INVALID_ARENA;
  213. extern const NSSError NSS_ERROR_INVALID_ARENA_MARK;
  214.  
  215. /*
  216.  * nssArena_Unmark
  217.  *
  218.  * This routine "commits" the indicated mark and any marks after
  219.  * it, making them unreleasable.  Note that any earlier marks can
  220.  * still be released, and such a release will invalidate these
  221.  * later unmarked regions.  If an arena is to be safely shared by
  222.  * more than one thread, all marks must be either released or
  223.  * unmarked.  This routine returns a PRStatus value; if successful,
  224.  * it will return PR_SUCCESS.  If unsuccessful, it will set an error
  225.  * on the error stack and return PR_FAILURE.
  226.  *
  227.  * The error may be one of the following values:
  228.  *  NSS_ERROR_INVALID_ARENA
  229.  *  NSS_ERROR_INVALID_ARENA_MARK
  230.  *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
  231.  *
  232.  * Return value:
  233.  *  PR_SUCCESS
  234.  *  PR_FAILURE
  235.  */
  236.  
  237. NSS_EXTERN PRStatus
  238. nssArena_Unmark
  239. (
  240.   NSSArena *arena,
  241.   nssArenaMark *arenaMark
  242. );
  243.  
  244. extern const NSSError NSS_ERROR_INVALID_ARENA;
  245. extern const NSSError NSS_ERROR_INVALID_ARENA_MARK;
  246. extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD;
  247.  
  248. #ifdef ARENA_DESTRUCTOR_LIST
  249.  
  250. /*
  251.  * nssArena_registerDestructor
  252.  *
  253.  * This routine stores a pointer to a callback and an arbitrary
  254.  * pointer-sized argument in the arena, at the current point in
  255.  * the mark stack.  If the arena is destroyed, or an "earlier"
  256.  * mark is released, then this destructor will be called at that
  257.  * time.  Note that the destructor will be called with the arena
  258.  * locked, which means the destructor may free memory in that
  259.  * arena, but it may not allocate or cause to be allocated any
  260.  * memory.  This callback facility was included to support our
  261.  * debug-version pointer-tracker feature; overuse runs counter to
  262.  * the the original intent of arenas.  This routine returns a 
  263.  * PRStatus value; if successful, it will return PR_SUCCESS.  If 
  264.  * unsuccessful, it will set an error on the error stack and 
  265.  * return PR_FAILURE.
  266.  *
  267.  * The error may be one of the following values:
  268.  *  NSS_ERROR_INVALID_ARENA
  269.  *  NSS_ERROR_NO_MEMORY
  270.  *
  271.  * Return value:
  272.  *  PR_SUCCESS
  273.  *  PR_FAILURE
  274.  */
  275.  
  276. NSS_EXTERN PRStatus
  277. nssArena_registerDestructor
  278. (
  279.   NSSArena *arena,
  280.   void (*destructor)(void *argument),
  281.   void *arg
  282. );
  283.  
  284. extern const NSSError NSS_ERROR_INVALID_ARENA;
  285. extern const NSSError NSS_ERROR_NO_MEMORY;
  286.  
  287. /*
  288.  * nssArena_deregisterDestructor
  289.  *
  290.  * This routine will remove the first destructor in the specified
  291.  * arena which has the specified destructor and argument values.
  292.  * The destructor will not be called.  This routine returns a
  293.  * PRStatus value; if successful, it will return PR_SUCCESS.  If 
  294.  * unsuccessful, it will set an error on the error stack and 
  295.  * return PR_FAILURE.
  296.  *
  297.  * The error may be one of the following values:
  298.  *  NSS_ERROR_INVALID_ARENA
  299.  *  NSS_ERROR_NOT_FOUND
  300.  *
  301.  * Return value:
  302.  *  PR_SUCCESS
  303.  *  PR_FAILURE
  304.  */
  305.  
  306. NSS_EXTERN PRStatus
  307. nssArena_deregisterDestructor
  308. (
  309.   NSSArena *arena,
  310.   void (*destructor)(void *argument),
  311.   void *arg
  312. );
  313.  
  314. extern const NSSError NSS_ERROR_INVALID_ITEM;
  315. extern const NSSError NSS_ERROR_INVALID_ARENA;
  316. extern const NSSError NSS_ERROR_NOT_FOUND;
  317.  
  318. #endif /* ARENA_DESTRUCTOR_LIST */
  319.  
  320. /*
  321.  * nss_ZAlloc
  322.  *
  323.  * This routine allocates and zeroes a section of memory of the 
  324.  * size, and returns to the caller a pointer to that memory.  If
  325.  * the optional arena argument is non-null, the memory will be
  326.  * obtained from that arena; otherwise, the memory will be obtained
  327.  * from the heap.  This routine may return NULL upon error, in
  328.  * which case it will have set an error upon the error stack.  The
  329.  * value specified for size may be zero; in which case a valid 
  330.  * zero-length block of memory will be allocated.  This block may
  331.  * be expanded by calling nss_ZRealloc.
  332.  *
  333.  * The error may be one of the following values:
  334.  *  NSS_ERROR_INVALID_ARENA
  335.  *  NSS_ERROR_NO_MEMORY
  336.  *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
  337.  *
  338.  * Return value:
  339.  *  NULL upon error
  340.  *  A pointer to the new segment of zeroed memory
  341.  */
  342.  
  343. NSS_EXTERN void *
  344. nss_ZAlloc
  345. (
  346.   NSSArena *arenaOpt,
  347.   PRUint32 size
  348. );
  349.  
  350. extern const NSSError NSS_ERROR_INVALID_ARENA;
  351. extern const NSSError NSS_ERROR_NO_MEMORY;
  352. extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD;
  353.  
  354. /*
  355.  * nss_ZFreeIf
  356.  *
  357.  * If the specified pointer is non-null, then the region of memory 
  358.  * to which it points -- which must have been allocated with 
  359.  * nss_ZAlloc -- will be zeroed and released.  This routine 
  360.  * returns a PRStatus value; if successful, it will return PR_SUCCESS.
  361.  * If unsuccessful, it will set an error on the error stack and return 
  362.  * PR_FAILURE.
  363.  *
  364.  * The error may be one of the following values:
  365.  *  NSS_ERROR_INVALID_POINTER
  366.  *
  367.  * Return value:
  368.  *  PR_SUCCESS
  369.  *  PR_FAILURE
  370.  */
  371.  
  372. NSS_EXTERN PRStatus
  373. nss_ZFreeIf
  374. (
  375.   void *pointer
  376. );
  377.  
  378. extern const NSSError NSS_ERROR_INVALID_POINTER;
  379.  
  380. /*
  381.  * nss_ZRealloc
  382.  *
  383.  * This routine reallocates a block of memory obtained by calling
  384.  * nss_ZAlloc or nss_ZRealloc.  The portion of memory 
  385.  * between the new and old sizes -- which is either being newly
  386.  * obtained or released -- is in either case zeroed.  This routine 
  387.  * may return NULL upon failure, in which case it will have placed 
  388.  * an error on the error stack.
  389.  *
  390.  * The error may be one of the following values:
  391.  *  NSS_ERROR_INVALID_POINTER
  392.  *  NSS_ERROR_NO_MEMORY
  393.  *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
  394.  *
  395.  * Return value:
  396.  *  NULL upon error
  397.  *  A pointer to the replacement segment of memory
  398.  */
  399.  
  400. NSS_EXTERN void *
  401. nss_ZRealloc
  402. (
  403.   void *pointer,
  404.   PRUint32 newSize
  405. );
  406.  
  407. extern const NSSError NSS_ERROR_INVALID_POINTER;
  408. extern const NSSError NSS_ERROR_NO_MEMORY;
  409. extern const NSSError NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD;
  410.  
  411. /*
  412.  * nss_ZNEW
  413.  *
  414.  * This preprocessor macro will allocate memory for a new object
  415.  * of the specified type with nss_ZAlloc, and will cast the
  416.  * return value appropriately.  If the optional arena argument is 
  417.  * non-null, the memory will be obtained from that arena; otherwise, 
  418.  * the memory will be obtained from the heap.  This routine may 
  419.  * return NULL upon error, in which case it will have set an error 
  420.  * upon the error stack.
  421.  *
  422.  * The error may be one of the following values:
  423.  *  NSS_ERROR_INVALID_ARENA
  424.  *  NSS_ERROR_NO_MEMORY
  425.  *
  426.  * Return value:
  427.  *  NULL upon error
  428.  *  A pointer to the new segment of zeroed memory
  429.  */
  430.  
  431. /* The following line exceeds 72 characters, but emacs screws up if I split it. */
  432. #define nss_ZNEW(arenaOpt, type) ((type *)nss_ZAlloc((arenaOpt), sizeof(type)))
  433.  
  434. /*
  435.  * nss_ZNEWARRAY
  436.  *
  437.  * This preprocessor macro will allocate memory for an array of
  438.  * new objects, and will cast the return value appropriately.
  439.  * If the optional arena argument is non-null, the memory will 
  440.  * be obtained from that arena; otherwise, the memory will be 
  441.  * obtained from the heap.  This routine may return NULL upon 
  442.  * error, in which case it will have set an error upon the error 
  443.  * stack.  The array size may be specified as zero.
  444.  *
  445.  * The error may be one of the following values:
  446.  *  NSS_ERROR_INVALID_ARENA
  447.  *  NSS_ERROR_NO_MEMORY
  448.  *
  449.  * Return value:
  450.  *  NULL upon error
  451.  *  A pointer to the new segment of zeroed memory
  452.  */
  453.  
  454. /* The following line exceeds 72 characters, but emacs screws up if I split it. */
  455. #define nss_ZNEWARRAY(arenaOpt, type, quantity) ((type *)nss_ZAlloc((arenaOpt), sizeof(type) * (quantity)))
  456.  
  457. /*
  458.  * nss_ZREALLOCARRAY
  459.  *
  460.  * This preprocessor macro will reallocate memory for an array of
  461.  * new objects, and will cast the return value appropriately.
  462.  * This routine may return NULL upon error, in which case it will 
  463.  *  have set an error upon the error stack.
  464.  *
  465.  * The error may be one of the following values:
  466.  *  NSS_ERROR_INVALID_POINTER
  467.  *  NSS_ERROR_NO_MEMORY
  468.  *  NSS_ERROR_ARENA_MARKED_BY_ANOTHER_THREAD
  469.  *
  470.  * Return value:
  471.  *  NULL upon error
  472.  *  A pointer to the replacement segment of memory
  473.  */
  474. #define nss_ZREALLOCARRAY(p, type, quantity) ((type *)nss_ZRealloc((p), sizeof(type) * (quantity)))
  475.  
  476. /*
  477.  * nssArena_verifyPointer
  478.  *
  479.  * This method is only present in debug builds.
  480.  *
  481.  * If the specified pointer is a valid pointer to an NSSArena object,
  482.  * this routine will return PR_SUCCESS.  Otherwise, it will put an
  483.  * error on the error stack and return PR_FAILURE.
  484.  *
  485.  * The error may be one of the following values:
  486.  *  NSS_ERROR_INVALID_ARENA
  487.  *
  488.  * Return value:
  489.  *  PR_SUCCESS if the pointer is valid
  490.  *  PR_FAILURE if it isn't
  491.  */
  492.  
  493. #ifdef DEBUG
  494. NSS_EXTERN PRStatus
  495. nssArena_verifyPointer
  496. (
  497.   const NSSArena *arena
  498. );
  499.  
  500. extern const NSSError NSS_ERROR_INVALID_ARENA;
  501. #endif /* DEBUG */
  502.  
  503. /*
  504.  * nssArena_VERIFYPOINTER
  505.  *
  506.  * This macro is always available.  In debug builds it will call
  507.  * nssArena_verifyPointer; in non-debug builds, it will merely
  508.  * check that the pointer is not null.  Note that in non-debug
  509.  * builds it cannot place an error on the error stack.
  510.  *
  511.  * Return value:
  512.  *  PR_SUCCESS if the pointer is valid
  513.  *  PR_FAILURE if it isn't
  514.  */
  515.  
  516. #ifdef DEBUG
  517. #define nssArena_VERIFYPOINTER(p) nssArena_verifyPointer(p)
  518. #else /* DEBUG */
  519. /* The following line exceeds 72 characters, but emacs screws up if I split it. */
  520. #define nssArena_VERIFYPOINTER(p) (((NSSArena *)NULL == (p))?PR_FAILURE:PR_SUCCESS)
  521. #endif /* DEBUG */
  522.  
  523. /*
  524.  * nssArenaHashAllocOps
  525.  *
  526.  * This constant structure contains allocation callbacks designed for
  527.  * use with the NSPL routine PL_NewHashTable.  For example:
  528.  *
  529.  *  NSSArena *hashTableArena = nssArena_Create();
  530.  *  PLHashTable *t = PL_NewHashTable(n, hasher, key_compare, 
  531.  *    value_compare, nssArenaHashAllocOps, hashTableArena);
  532.  */
  533.  
  534. NSS_EXTERN_DATA PLHashAllocOps nssArenaHashAllocOps;
  535.  
  536. /*
  537.  * The error stack
  538.  *
  539.  * The nonpublic methods relating to the error stack are:
  540.  *
  541.  *  nss_SetError
  542.  *  nss_ClearErrorStack
  543.  */
  544.  
  545. /*
  546.  * nss_SetError
  547.  *
  548.  * This routine places a new error code on the top of the calling 
  549.  * thread's error stack.  Calling this routine wiht an error code
  550.  * of zero will clear the error stack.
  551.  */
  552.  
  553. NSS_EXTERN void
  554. nss_SetError
  555. (
  556.   PRUint32 error
  557. );
  558.  
  559. /*
  560.  * nss_ClearErrorStack
  561.  *
  562.  * This routine clears the calling thread's error stack.
  563.  */
  564.  
  565. NSS_EXTERN void
  566. nss_ClearErrorStack
  567. (
  568.   void
  569. );
  570.  
  571. /*
  572.  * NSSItem
  573.  *
  574.  * nssItem_Create
  575.  * nssItem_Duplicate
  576.  * nssItem_Equal
  577.  */
  578.  
  579. NSS_EXTERN NSSItem *
  580. nssItem_Create
  581. (
  582.   NSSArena *arenaOpt,
  583.   NSSItem *rvOpt,
  584.   PRUint32 length,
  585.   const void *data
  586. );
  587.  
  588. NSS_EXTERN void
  589. nssItem_Destroy
  590. (
  591.   NSSItem *item
  592. );
  593.  
  594. NSS_EXTERN NSSItem *
  595. nssItem_Duplicate
  596. (
  597.   NSSItem *obj,
  598.   NSSArena *arenaOpt,
  599.   NSSItem *rvOpt
  600. );
  601.  
  602. NSS_EXTERN PRBool
  603. nssItem_Equal
  604. (
  605.   const NSSItem *one,
  606.   const NSSItem *two,
  607.   PRStatus *statusOpt
  608. );
  609.  
  610. /*
  611.  * NSSUTF8
  612.  *
  613.  *  nssUTF8_CaseIgnoreMatch
  614.  *  nssUTF8_Duplicate
  615.  *  nssUTF8_Size
  616.  *  nssUTF8_Length
  617.  *  nssUTF8_CopyIntoFixedBuffer
  618.  */
  619.  
  620. /*
  621.  * nssUTF8_CaseIgnoreMatch
  622.  * 
  623.  * Returns true if the two UTF8-encoded strings pointed to by the 
  624.  * two specified NSSUTF8 pointers differ only in typcase.
  625.  *
  626.  * The error may be one of the following values:
  627.  *  NSS_ERROR_INVALID_POINTER
  628.  *
  629.  * Return value:
  630.  *  PR_TRUE if the strings match, ignoring case
  631.  *  PR_FALSE if they don't
  632.  *  PR_FALSE upon error
  633.  */
  634.  
  635. NSS_EXTERN PRBool
  636. nssUTF8_CaseIgnoreMatch
  637. (
  638.   const NSSUTF8 *a,
  639.   const NSSUTF8 *b,
  640.   PRStatus *statusOpt
  641. );
  642.  
  643. /*
  644.  * nssUTF8_Duplicate
  645.  *
  646.  * This routine duplicates the UTF8-encoded string pointed to by the
  647.  * specified NSSUTF8 pointer.  If the optional arenaOpt argument is
  648.  * not null, the memory required will be obtained from that arena;
  649.  * otherwise, the memory required will be obtained from the heap.
  650.  * A pointer to the new string will be returned.  In case of error,
  651.  * an error will be placed on the error stack and NULL will be 
  652.  * returned.
  653.  *
  654.  * The error may be one of the following values:
  655.  *  NSS_ERROR_INVALID_POINTER
  656.  *  NSS_ERROR_INVALID_ARENA
  657.  *  NSS_ERROR_NO_MEMORY
  658.  */
  659.  
  660. NSS_EXTERN NSSUTF8 *
  661. nssUTF8_Duplicate
  662. (
  663.   const NSSUTF8 *s,
  664.   NSSArena *arenaOpt
  665. );
  666.  
  667. /*
  668.  * nssUTF8_PrintableMatch
  669.  *
  670.  * Returns true if the two Printable strings pointed to by the 
  671.  * two specified NSSUTF8 pointers match when compared with the 
  672.  * rules for Printable String (leading and trailing spaces are 
  673.  * disregarded, extents of whitespace match irregardless of length, 
  674.  * and case is not significant), then PR_TRUE will be returned.
  675.  * Otherwise, PR_FALSE will be returned.  Upon failure, PR_FALSE
  676.  * will be returned.  If the optional statusOpt argument is not
  677.  * NULL, then PR_SUCCESS or PR_FAILURE will be stored in that
  678.  * location.
  679.  *
  680.  * The error may be one of the following values:
  681.  *  NSS_ERROR_INVALID_POINTER
  682.  *
  683.  * Return value:
  684.  *  PR_TRUE if the strings match, ignoring case
  685.  *  PR_FALSE if they don't
  686.  *  PR_FALSE upon error
  687.  */
  688.  
  689. NSS_EXTERN PRBool
  690. nssUTF8_PrintableMatch
  691. (
  692.   const NSSUTF8 *a,
  693.   const NSSUTF8 *b,
  694.   PRStatus *statusOpt
  695. );
  696.  
  697. /*
  698.  * nssUTF8_Size
  699.  *
  700.  * This routine returns the length in bytes (including the terminating
  701.  * null) of the UTF8-encoded string pointed to by the specified
  702.  * NSSUTF8 pointer.  Zero is returned on error.
  703.  *
  704.  * The error may be one of the following values:
  705.  *  NSS_ERROR_INVALID_POINTER
  706.  *  NSS_ERROR_VALUE_TOO_LARGE
  707.  *
  708.  * Return value:
  709.  *  nonzero size of the string
  710.  *  0 on error
  711.  */
  712.  
  713. NSS_EXTERN PRUint32
  714. nssUTF8_Size
  715. (
  716.   const NSSUTF8 *s,
  717.   PRStatus *statusOpt
  718. );
  719.  
  720. extern const NSSError NSS_ERROR_INVALID_POINTER;
  721. extern const NSSError NSS_ERROR_VALUE_TOO_LARGE;
  722.  
  723. /*
  724.  * nssUTF8_Length
  725.  *
  726.  * This routine returns the length in characters (not including the
  727.  * terminating null) of the UTF8-encoded string pointed to by the
  728.  * specified NSSUTF8 pointer.
  729.  *
  730.  * The error may be one of the following values:
  731.  *  NSS_ERROR_INVALID_POINTER
  732.  *  NSS_ERROR_VALUE_TOO_LARGE
  733.  *  NSS_ERROR_INVALID_STRING
  734.  *
  735.  * Return value:
  736.  *  length of the string (which may be zero)
  737.  *  0 on error
  738.  */
  739.  
  740. NSS_EXTERN PRUint32
  741. nssUTF8_Length
  742. (
  743.   const NSSUTF8 *s,
  744.   PRStatus *statusOpt
  745. );
  746.  
  747. extern const NSSError NSS_ERROR_INVALID_POINTER;
  748. extern const NSSError NSS_ERROR_VALUE_TOO_LARGE;
  749. extern const NSSError NSS_ERROR_INVALID_STRING;
  750.  
  751. /*
  752.  * nssUTF8_Create
  753.  *
  754.  * This routine creates a UTF8 string from a string in some other
  755.  * format.  Some types of string may include embedded null characters,
  756.  * so for them the length parameter must be used.  For string types
  757.  * that are null-terminated, the length parameter is optional; if it
  758.  * is zero, it will be ignored.  If the optional arena argument is
  759.  * non-null, the memory used for the new string will be obtained from
  760.  * that arena, otherwise it will be obtained from the heap.  This
  761.  * routine may return NULL upon error, in which case it will have
  762.  * placed an error on the error stack.
  763.  *
  764.  * The error may be one of the following:
  765.  *  NSS_ERROR_INVALID_POINTER
  766.  *  NSS_ERROR_NO_MEMORY
  767.  *  NSS_ERROR_UNSUPPORTED_TYPE
  768.  *
  769.  * Return value:
  770.  *  NULL upon error
  771.  *  A non-null pointer to a new UTF8 string otherwise
  772.  */
  773.  
  774. NSS_EXTERN NSSUTF8 *
  775. nssUTF8_Create
  776. (
  777.   NSSArena *arenaOpt,
  778.   nssStringType type,
  779.   const void *inputString,
  780.   PRUint32 size /* in bytes, not characters */
  781. );
  782.  
  783. extern const NSSError NSS_ERROR_INVALID_POINTER;
  784. extern const NSSError NSS_ERROR_NO_MEMORY;
  785. extern const NSSError NSS_ERROR_UNSUPPORTED_TYPE;
  786.  
  787. NSS_EXTERN NSSItem *
  788. nssUTF8_GetEncoding
  789. (
  790.   NSSArena *arenaOpt,
  791.   NSSItem *rvOpt,
  792.   nssStringType type,
  793.   NSSUTF8 *string
  794. );
  795.  
  796. /*
  797.  * nssUTF8_CopyIntoFixedBuffer
  798.  *
  799.  * This will copy a UTF8 string into a fixed-length buffer, making 
  800.  * sure that the all characters are valid.  Any remaining space will
  801.  * be padded with the specified ASCII character, typically either 
  802.  * null or space.
  803.  *
  804.  * Blah, blah, blah.
  805.  */
  806.  
  807. extern const NSSError NSS_ERROR_INVALID_POINTER;
  808. extern const NSSError NSS_ERROR_INVALID_ARGUMENT;
  809.  
  810. NSS_EXTERN PRStatus
  811. nssUTF8_CopyIntoFixedBuffer
  812. (
  813.   NSSUTF8 *string,
  814.   char *buffer,
  815.   PRUint32 bufferSize,
  816.   char pad
  817. );
  818.  
  819. /*
  820.  * nssUTF8_Equal
  821.  *
  822.  */
  823.  
  824. NSS_EXTERN PRBool
  825. nssUTF8_Equal
  826. (
  827.   const NSSUTF8 *a,
  828.   const NSSUTF8 *b,
  829.   PRStatus *statusOpt
  830. );
  831.  
  832. /*
  833.  * nssList
  834.  *
  835.  * The goal is to provide a simple, optionally threadsafe, linked list
  836.  * class.  Since NSS did not seem to use the circularity of PRCList
  837.  * much before, this provides a list that appears to be a linear,
  838.  * NULL-terminated list.
  839.  */
  840.  
  841. /*
  842.  * nssList_Create
  843.  *
  844.  * If threadsafe is true, the list will be locked during modifications
  845.  * and traversals.
  846.  */
  847. NSS_EXTERN nssList *
  848. nssList_Create
  849. (
  850.   NSSArena *arenaOpt,
  851.   PRBool threadSafe
  852. );
  853.  
  854. /*
  855.  * nssList_Destroy
  856.  */
  857. NSS_EXTERN PRStatus
  858. nssList_Destroy
  859. (
  860.   nssList *list
  861. );
  862.  
  863. NSS_EXTERN void
  864. nssList_Clear
  865. (
  866.   nssList *list, 
  867.   nssListElementDestructorFunc destructor
  868. );
  869.  
  870. /*
  871.  * nssList_SetCompareFunction
  872.  *
  873.  * By default, two list elements will be compared by comparing their
  874.  * data pointers.  By setting this function, the user can control
  875.  * how elements are compared.
  876.  */
  877. NSS_EXTERN void
  878. nssList_SetCompareFunction
  879. (
  880.   nssList *list, 
  881.   nssListCompareFunc compareFunc
  882. );
  883.  
  884. /*
  885.  * nssList_SetSortFunction
  886.  *
  887.  * Sort function to use for an ordered list.
  888.  */
  889. NSS_EXTERN void
  890. nssList_SetSortFunction
  891. (
  892.   nssList *list, 
  893.   nssListSortFunc sortFunc
  894. );
  895.  
  896. /*
  897.  * nssList_Add
  898.  */
  899. NSS_EXTERN PRStatus
  900. nssList_Add
  901. (
  902.   nssList *list, 
  903.   void *data
  904. );
  905.  
  906. /*
  907.  * nssList_AddUnique
  908.  *
  909.  * This will use the compare function to see if the element is already
  910.  * in the list.
  911.  */
  912. NSS_EXTERN PRStatus
  913. nssList_AddUnique
  914. (
  915.   nssList *list, 
  916.   void *data
  917. );
  918.  
  919. /*
  920.  * nssList_Remove
  921.  *
  922.  * Uses the compare function to locate the element and remove it.
  923.  */
  924. NSS_EXTERN PRStatus
  925. nssList_Remove(nssList *list, void *data);
  926.  
  927. /*
  928.  * nssList_Get
  929.  *
  930.  * Uses the compare function to locate an element.  Also serves as
  931.  * nssList_Exists.
  932.  */
  933. NSS_EXTERN void *
  934. nssList_Get
  935. (
  936.   nssList *list, 
  937.   void *data
  938. );
  939.  
  940. /*
  941.  * nssList_Count
  942.  */
  943. NSS_EXTERN PRUint32
  944. nssList_Count
  945. (
  946.   nssList *list
  947. );
  948.  
  949. /*
  950.  * nssList_GetArray
  951.  *
  952.  * Fill rvArray, up to maxElements, with elements in the list.  The
  953.  * array is NULL-terminated, so its allocated size must be maxElements + 1.
  954.  */
  955. NSS_EXTERN PRStatus
  956. nssList_GetArray
  957. (
  958.   nssList *list, 
  959.   void **rvArray, 
  960.   PRUint32 maxElements
  961. );
  962.  
  963. /*
  964.  * nssList_CreateIterator
  965.  *
  966.  * Create an iterator for list traversal.
  967.  */
  968. NSS_EXTERN nssListIterator *
  969. nssList_CreateIterator
  970. (
  971.   nssList *list
  972. );
  973.  
  974. NSS_EXTERN nssList *
  975. nssList_Clone
  976. (
  977.   nssList *list
  978. );
  979.  
  980. /*
  981.  * nssListIterator_Destroy
  982.  */
  983. NSS_EXTERN void
  984. nssListIterator_Destroy
  985. (
  986.   nssListIterator *iter
  987. );
  988.  
  989. /*
  990.  * nssListIterator_Start
  991.  *
  992.  * Begin a list iteration.  After this call, if the list is threadSafe,
  993.  * the list is *locked*.
  994.  */
  995. NSS_EXTERN void *
  996. nssListIterator_Start
  997. (
  998.   nssListIterator *iter
  999. );
  1000.  
  1001. /*
  1002.  * nssListIterator_Next
  1003.  *
  1004.  * Continue a list iteration.
  1005.  */
  1006. NSS_EXTERN void *
  1007. nssListIterator_Next
  1008. (
  1009.   nssListIterator *iter
  1010. );
  1011.  
  1012. /*
  1013.  * nssListIterator_Finish
  1014.  *
  1015.  * Complete a list iteration.  This *must* be called in order for the
  1016.  * lock to be released.
  1017.  */
  1018. NSS_EXTERN PRStatus
  1019. nssListIterator_Finish
  1020. (
  1021.   nssListIterator *iter
  1022. );
  1023.  
  1024. /*
  1025.  * nssHash
  1026.  *
  1027.  *  nssHash_Create
  1028.  *  nssHash_Destroy
  1029.  *  nssHash_Add
  1030.  *  nssHash_Remove
  1031.  *  nssHash_Count
  1032.  *  nssHash_Exists
  1033.  *  nssHash_Lookup
  1034.  *  nssHash_Iterate
  1035.  */
  1036.  
  1037. /*
  1038.  * nssHash_Create
  1039.  *
  1040.  */
  1041.  
  1042. NSS_EXTERN nssHash *
  1043. nssHash_Create
  1044. (
  1045.   NSSArena *arenaOpt,
  1046.   PRUint32 numBuckets,
  1047.   PLHashFunction keyHash,
  1048.   PLHashComparator keyCompare,
  1049.   PLHashComparator valueCompare
  1050. );
  1051.  
  1052. NSS_EXTERN nssHash *
  1053. nssHash_CreatePointer
  1054. (
  1055.   NSSArena *arenaOpt,
  1056.   PRUint32 numBuckets
  1057. );
  1058.  
  1059. NSS_EXTERN nssHash *
  1060. nssHash_CreateString
  1061. (
  1062.   NSSArena *arenaOpt,
  1063.   PRUint32 numBuckets
  1064. );
  1065.  
  1066. NSS_EXTERN nssHash *
  1067. nssHash_CreateItem
  1068. (
  1069.   NSSArena *arenaOpt,
  1070.   PRUint32 numBuckets
  1071. );
  1072.  
  1073. /*
  1074.  * nssHash_Destroy
  1075.  *
  1076.  */
  1077. NSS_EXTERN void
  1078. nssHash_Destroy
  1079. (
  1080.   nssHash *hash
  1081. );
  1082.  
  1083. /*
  1084.  * nssHash_Add
  1085.  *
  1086.  */
  1087.  
  1088. extern const NSSError NSS_ERROR_HASH_COLLISION;
  1089.  
  1090. NSS_EXTERN PRStatus
  1091. nssHash_Add
  1092. (
  1093.   nssHash *hash,
  1094.   const void *key,
  1095.   const void *value
  1096. );
  1097.  
  1098. /*
  1099.  * nssHash_Remove
  1100.  *
  1101.  */
  1102. NSS_EXTERN void
  1103. nssHash_Remove
  1104. (
  1105.   nssHash *hash,
  1106.   const void *it
  1107. );
  1108.  
  1109. /*
  1110.  * nssHash_Count
  1111.  *
  1112.  */
  1113. NSS_EXTERN PRUint32
  1114. nssHash_Count
  1115. (
  1116.   nssHash *hash
  1117. );
  1118.  
  1119. /*
  1120.  * nssHash_Exists
  1121.  *
  1122.  */
  1123. NSS_EXTERN PRBool
  1124. nssHash_Exists
  1125. (
  1126.   nssHash *hash,
  1127.   const void *it
  1128. );
  1129.  
  1130. /*
  1131.  * nssHash_Lookup
  1132.  *
  1133.  */
  1134. NSS_EXTERN void *
  1135. nssHash_Lookup
  1136. (
  1137.   nssHash *hash,
  1138.   const void *it
  1139. );
  1140.  
  1141. /*
  1142.  * nssHash_Iterate
  1143.  *
  1144.  */
  1145. NSS_EXTERN void
  1146. nssHash_Iterate
  1147. (
  1148.   nssHash *hash,
  1149.   nssHashIterator fcn,
  1150.   void *closure
  1151. );
  1152.  
  1153.  
  1154. /*
  1155.  * nssPointerTracker
  1156.  *
  1157.  * This type and these methods are only present in debug builds.
  1158.  * 
  1159.  * The nonpublic methods relating to this type are:
  1160.  *
  1161.  *  nssPointerTracker_initialize
  1162.  *  nssPointerTracker_finalize
  1163.  *  nssPointerTracker_add
  1164.  *  nssPointerTracker_remove
  1165.  *  nssPointerTracker_verify
  1166.  */
  1167.  
  1168. /*
  1169.  * nssPointerTracker_initialize
  1170.  *
  1171.  * This method is only present in debug builds.
  1172.  * 
  1173.  * This routine initializes an nssPointerTracker object.  Note that
  1174.  * the object must have been declared *static* to guarantee that it
  1175.  * is in a zeroed state initially.  This routine is idempotent, and
  1176.  * may even be safely called by multiple threads simultaneously with 
  1177.  * the same argument.  This routine returns a PRStatus value; if 
  1178.  * successful, it will return PR_SUCCESS.  On failure it will set an 
  1179.  * error on the error stack and return PR_FAILURE.
  1180.  *
  1181.  * The error may be one of the following values:
  1182.  *  NSS_ERROR_NO_MEMORY
  1183.  *
  1184.  * Return value:
  1185.  *  PR_SUCCESS
  1186.  *  PR_FAILURE
  1187.  */
  1188.  
  1189. #ifdef DEBUG
  1190. NSS_EXTERN PRStatus
  1191. nssPointerTracker_initialize
  1192. (
  1193.   nssPointerTracker *tracker
  1194. );
  1195.  
  1196. extern const NSSError NSS_ERROR_NO_MEMORY;
  1197. #endif /* DEBUG */
  1198.  
  1199. /*
  1200.  * nssPointerTracker_finalize
  1201.  *
  1202.  * This method is only present in debug builds.
  1203.  * 
  1204.  * This routine returns the nssPointerTracker object to the pre-
  1205.  * initialized state, releasing all resources used by the object.
  1206.  * It will *NOT* destroy the objects being tracked by the pointer
  1207.  * (should any remain), and therefore cannot be used to "sweep up"
  1208.  * remaining objects.  This routine returns a PRStatus value; if
  1209.  * successful, it will return PR_SUCCES.  On failure it will set an
  1210.  * error on the error stack and return PR_FAILURE.  If any objects
  1211.  * remain in the tracker when it is finalized, that will be treated
  1212.  * as an error.
  1213.  *
  1214.  * The error may be one of the following values:
  1215.  *  NSS_ERROR_TRACKER_NOT_EMPTY
  1216.  *
  1217.  * Return value:
  1218.  *  PR_SUCCESS
  1219.  *  PR_FAILURE
  1220.  */
  1221.  
  1222. #ifdef DEBUG
  1223. NSS_EXTERN PRStatus
  1224. nssPointerTracker_finalize
  1225. (
  1226.   nssPointerTracker *tracker
  1227. );
  1228.  
  1229. extern const NSSError NSS_ERROR_TRACKER_NOT_EMPTY;
  1230. #endif /* DEBUG */
  1231.  
  1232. /*
  1233.  * nssPointerTracker_add
  1234.  *
  1235.  * This method is only present in debug builds.
  1236.  *
  1237.  * This routine adds the specified pointer to the nssPointerTracker
  1238.  * object.  It should be called in constructor objects to register
  1239.  * new valid objects.  The nssPointerTracker is threadsafe, but this
  1240.  * call is not idempotent.  This routine returns a PRStatus value;
  1241.  * if successful it will return PR_SUCCESS.  On failure it will set
  1242.  * an error on the error stack and return PR_FAILURE.
  1243.  *
  1244.  * The error may be one of the following values:
  1245.  *  NSS_ERROR_NO_MEMORY
  1246.  *  NSS_ERROR_TRACKER_NOT_INITIALIZED
  1247.  *  NSS_ERROR_DUPLICATE_POINTER
  1248.  *
  1249.  * Return value:
  1250.  *  PR_SUCCESS
  1251.  *  PR_FAILURE
  1252.  */
  1253.  
  1254. #ifdef DEBUG
  1255. NSS_EXTERN PRStatus
  1256. nssPointerTracker_add
  1257. (
  1258.   nssPointerTracker *tracker,
  1259.   const void *pointer
  1260. );
  1261.  
  1262. extern const NSSError NSS_ERROR_NO_MEMORY;
  1263. extern const NSSError NSS_ERROR_TRACKER_NOT_INITIALIZED;
  1264. extern const NSSError NSS_ERROR_DUPLICATE_POINTER;
  1265. #endif /* DEBUG */
  1266.  
  1267. /*
  1268.  * nssPointerTracker_remove
  1269.  *
  1270.  * This method is only present in debug builds.
  1271.  *
  1272.  * This routine removes the specified pointer from the 
  1273.  * nssPointerTracker object.  It does not call any destructor for the
  1274.  * object; rather, this should be called from the object's destructor.
  1275.  * The nssPointerTracker is threadsafe, but this call is not 
  1276.  * idempotent.  This routine returns a PRStatus value; if successful 
  1277.  * it will return PR_SUCCESS.  On failure it will set an error on the 
  1278.  * error stack and return PR_FAILURE.
  1279.  *
  1280.  * The error may be one of the following values:
  1281.  *  NSS_ERROR_TRACKER_NOT_INITIALIZED
  1282.  *  NSS_ERROR_POINTER_NOT_REGISTERED
  1283.  *
  1284.  * Return value:
  1285.  *  PR_SUCCESS
  1286.  *  PR_FAILURE
  1287.  */
  1288.  
  1289. #ifdef DEBUG
  1290. NSS_EXTERN PRStatus
  1291. nssPointerTracker_remove
  1292. (
  1293.   nssPointerTracker *tracker,
  1294.   const void *pointer
  1295. );
  1296.  
  1297. extern const NSSError NSS_ERROR_TRACKER_NOT_INITIALIZED;
  1298. extern const NSSError NSS_ERROR_POINTER_NOT_REGISTERED;
  1299. #endif /* DEBUG */
  1300.  
  1301. /*
  1302.  * nssPointerTracker_verify
  1303.  *
  1304.  * This method is only present in debug builds.
  1305.  *
  1306.  * This routine verifies that the specified pointer has been registered
  1307.  * with the nssPointerTracker object.  The nssPointerTracker object is
  1308.  * threadsafe, and this call may be safely called from multiple threads
  1309.  * simultaneously with the same arguments.  This routine returns a
  1310.  * PRStatus value; if the pointer is registered this will return 
  1311.  * PR_SUCCESS.  Otherwise it will set an error on the error stack and 
  1312.  * return PR_FAILURE.  Although the error is suitable for leaving on 
  1313.  * the stack, callers may wish to augment the information available by 
  1314.  * placing a more type-specific error on the stack.
  1315.  *
  1316.  * The error may be one of the following values:
  1317.  *  NSS_ERROR_POINTER_NOT_REGISTERED
  1318.  *
  1319.  * Return value:
  1320.  *  PR_SUCCESS
  1321.  *  PR_FAILRUE
  1322.  */
  1323.  
  1324. #ifdef DEBUG
  1325. NSS_EXTERN PRStatus
  1326. nssPointerTracker_verify
  1327. (
  1328.   nssPointerTracker *tracker,
  1329.   const void *pointer
  1330. );
  1331.  
  1332. extern const NSSError NSS_ERROR_POINTER_NOT_REGISTERED;
  1333. #endif /* DEBUG */
  1334.  
  1335. /*
  1336.  * libc
  1337.  *
  1338.  * nsslibc_memcpy
  1339.  * nsslibc_memset
  1340.  * nsslibc_offsetof
  1341.  */
  1342.  
  1343. /*
  1344.  * nsslibc_memcpy
  1345.  *
  1346.  * Errors:
  1347.  *  NSS_ERROR_INVALID_POINTER
  1348.  *
  1349.  * Return value:
  1350.  *  NULL on error
  1351.  *  The destination pointer on success
  1352.  */
  1353.  
  1354. NSS_EXTERN void *
  1355. nsslibc_memcpy
  1356. (
  1357.   void *dest,
  1358.   const void *source,
  1359.   PRUint32 n
  1360. );
  1361.  
  1362. extern const NSSError NSS_ERROR_INVALID_POINTER;
  1363.  
  1364. /*
  1365.  * nsslibc_memset
  1366.  *
  1367.  * Errors:
  1368.  *  NSS_ERROR_INVALID_POINTER
  1369.  *
  1370.  * Return value:
  1371.  *  NULL on error
  1372.  *  The destination pointer on success
  1373.  */
  1374.  
  1375. NSS_EXTERN void *
  1376. nsslibc_memset
  1377. (
  1378.   void *dest,
  1379.   PRUint8 byte,
  1380.   PRUint32 n
  1381. );
  1382.  
  1383. extern const NSSError NSS_ERROR_INVALID_POINTER;
  1384.  
  1385. /*
  1386.  * nsslibc_memequal
  1387.  *
  1388.  * Errors:
  1389.  *  NSS_ERROR_INVALID_POINTER
  1390.  *
  1391.  * Return value:
  1392.  *  PR_TRUE if they match
  1393.  *  PR_FALSE if they don't
  1394.  *  PR_FALSE upon error
  1395.  */
  1396.  
  1397. NSS_EXTERN PRBool
  1398. nsslibc_memequal
  1399. (
  1400.   const void *a,
  1401.   const void *b,
  1402.   PRUint32 len,
  1403.   PRStatus *statusOpt
  1404. );
  1405.  
  1406. extern const NSSError NSS_ERROR_INVALID_POINTER;
  1407.  
  1408. #define nsslibc_offsetof(str, memb) ((PRPtrdiff)(&(((str *)0)->memb)))
  1409.  
  1410. /*
  1411.  * nss_NewThreadPrivateIndex
  1412.  * 
  1413.  */
  1414.  
  1415. NSS_EXTERN PRStatus
  1416. nss_NewThreadPrivateIndex
  1417. (
  1418.   PRUintn *ip,
  1419.   PRThreadPrivateDTOR dtor
  1420. );
  1421.  
  1422. /*
  1423.  * nss_GetThreadPrivate
  1424.  *
  1425.  */
  1426.  
  1427. NSS_EXTERN void *
  1428. nss_GetThreadPrivate
  1429. (
  1430.   PRUintn i
  1431. );
  1432.  
  1433. /*
  1434.  * nss_SetThreadPrivate
  1435.  *
  1436.  */
  1437.  
  1438. NSS_EXTERN void
  1439. nss_SetThreadPrivate
  1440. (
  1441.   PRUintn i,
  1442.   void *v
  1443. );
  1444.  
  1445.  
  1446. PR_END_EXTERN_C
  1447.  
  1448. #endif /* BASE_H */
  1449.